package com.alan.nio.buf;

import java.nio.ByteBuffer;

/**
 * 根据缓冲区存储的数据类似不同分为
 * ByteBuffer
 * ShortBuffer
 * IntBuffer
 * LongBuffer
 * FloatBuffer
 * DoubleBuffer
 * CharBuffer
 * 上述的缓冲区管理方式几乎一到处，通过allocate（）获取
 *
 * 二 缓冲区的4个核心属性
 *      capacity:容量 表示缓冲区最大的存储量，一是明显不可改变
 *      limit;界限 表示缓冲区中可操作的数据大小limit之扣的数据不能被读书
 *      position:位置 表示的是当前正在操作的元素的下一位
 *      mark: 标记(存档),记录当前postition的位置，以后可以通过reset方法恢复到mark的位置
 *      position <= limit <= capacity
 *
 * 三
 *      put()
 *      get()
 *
 * Created by Alan on 2017/8/5.
 */
public class BufferTest {

    public static void main(String[] args) {
        //创建一个大小为20的缓冲区
        ByteBuffer byteBuffer = ByteBuffer.allocate(20);
        System.out.println("----------allocate--------");
        System.out.println(byteBuffer.capacity());//20
        System.out.println(byteBuffer.limit());//20
        System.out.println(byteBuffer.position());//0
        String data = "abcdefg";
        //利用put存数据
        byteBuffer.put(data.getBytes());
        System.out.println(byteBuffer.capacity());//20
        System.out.println(byteBuffer.limit());//20
        System.out.println(byteBuffer.position());//7
        //切换读取模式
        byteBuffer.flip();//当前位置为0
        //取
        System.out.println("----------flip--------");
        System.out.println(byteBuffer.capacity());//20
        System.out.println(byteBuffer.limit());//7
        System.out.println(byteBuffer.position());//0

        byte [] dst = new byte[byteBuffer.limit()];
        byteBuffer.get(dst);
        System.out.println(new String(dst));
        System.out.println("----------get--------");
        System.out.println(byteBuffer.capacity());//20
        System.out.println(byteBuffer.limit());//7
        System.out.println(byteBuffer.position());//7

        //重读
        byteBuffer.rewind();
    }

}
